package main

import (
	"fmt"
	_ "newWebwithGo/models"
	"reflect"

	// 添加下划线默认调用init函数
	_ "newWebwithGo/routers"

	"github.com/astaxie/beego"
)

func whichType(iface interface{}) {
	fmt.Println("这个进入该函数的参数是", iface)
}

func myfunc(i interface{}) {
	switch i.(type) {

	case int:
		fmt.Println("参数的类型是 int")
	case string:
		fmt.Println("参数的类型是 string")
	}

}

func main() {

	// 让函数接受一个任意类型的值可以使用空接口

	whichType(1)
	whichType("我是一个string")
	whichType(true)
	/* 坑1：空接口可以承载任意值，但不代表任意类型就可以承接空接口类型的值

	   从实现的角度看，任何类型的值都满足空接口。因此空接口类型可以保存任何值，也可以从空接口中取出原值。

	   但要是你把一个空接口类型的对象，再赋值给一个固定类型（比如 int, string等类型）的对象赋值，是会报错的。 */
	/*
	   !var a int = 1
	   !  // 声明i变量, 类型为interface{}, 初始值为a, 此时i的值变为1
	   ! var i interface{} = a
	   !
	   !    声明b变量, 尝试赋值i
	   !  var b int = i */

	var name string = "Go里的变量都是值传递"

	v1 := reflect.ValueOf(name)
	fmt.Println("v1可写性为", v1.CanSet())

	// !空接口承载数组和切片的时候，对象将无法再进行切片

	a := 15

	myfunc(a)
	b := "string"
	myfunc(b)

	/* 要让反射对象具备可写性，需要注意两点

	   创建反射对象时传入变量的指针
	   使用 Elem()函数返回指针指向的数据 */
	v2 := v1.Elem()
	fmt.Println("v2可写性为", v2.CanSet())

	////////////////////////
	beego.Run()

}
